package com.etc.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utile {
	/**
	   * MD5加密方法
	   * @param str不允许为null  传入的需要进行MD5加密的String字符串,
	   * @return MD5加密后的字符串
	   * @throws NoSuchAlgorithmException
	   */
	  public static String EncodeByMD5(String str)  {
	    //获取一个信息摘要器
	    MessageDigest messageDigest;
		try {
			messageDigest = MessageDigest.getInstance("MD5");
			//通过将字符串填充到摘要器中并进行hash计算得到一个长度为16的byte数组
		    byte[] weitHandleByte = messageDigest.digest(str.getBytes());
		    //临时存放weitHandleByte
		    int tempWeitHandleByte;
		    //创建一个StringBuffer 用于装在载加密后的字符
		    StringBuffer sb = new StringBuffer();
		    //遍历获取到的byte数组，生成具体的MD5密码
		    for (byte b : weitHandleByte) {
		      tempWeitHandleByte = b;
		      if(tempWeitHandleByte<0)
		        tempWeitHandleByte+=265;
		      if(tempWeitHandleByte<16)
		        sb.append("0");
		      sb.append(Integer.toHexString(tempWeitHandleByte));
		    }
		    return getBegginAndEndStr(sb.toString().substring(8, 24));
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	  }
	  /**
	   * @param str不允许为null 需要核对的字符串
	   * @param codeStr str经过MD5加密后的字符串
	   * @return 返回对比结果
	   * @throws NoSuchAlgorithmException
	   */
	  public static boolean DecodeByMD5(String str,String codeStr) {
	    String temp = EncodeByMD5(str); 
	    if(temp.startsWith(codeStr.substring(0, 5))&&temp.endsWith(codeStr.substring(11,16)))
	      return true;
	    else
	      return false;
	  }

	  /**
	   * 为了防止暴力破解密码，因此需要经过截取前5个字符和后5个字符以及随机生成的6个字符拼接字符串
	   * @param str MD5加密后的字符串
	   * @return 返回经过截取前5个字符和后5个字符以及随机生成的6个字符拼接而成的字符串
	   */
	  private static String getBegginAndEndStr(String str){
	    //截取MD5加密后的前5个字符
	    String beggin = str.substring(0,5);
	    //截取MD5加密后的后5个字符
	    String end = str.substring(11,16);
	    //创建6个随机的字符
	    String middle="";
	    for(int i=0;i<3;i++)
	      middle = middle+Integer.toHexString((int)(16+Math.random()*(265-16+1)));
	    return beggin+middle+end;
	  }
}
